package com.keyue.isolate.handler;


import com.keyue.isolate.context.DataIsolateValue;
import com.keyue.isolate.context.IsolateTableConfigVO;
import com.keyue.isolate.enums.DataIsolateValueTypeEnum;
import net.sf.jsqlparser.expression.Expression;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public abstract class DataIsolateExpStragegy {

    abstract Expression parse(DataIsolateValue dataIsolateValue, String prefix, IsolateTableConfigVO configVO);

    /**
     * 根据dataIsolateValueName获取对应的值
     * 由于valueName的值有限 且不太会变 故直接写死 不使用反射或其他方式获取
     *
     * @param dataIsolateValue
     * @param dataIsolateValueName
     * @return
     */
    public static List<String> getCodes(DataIsolateValue dataIsolateValue, String dataIsolateValueName) {

        if (DataIsolateValueTypeEnum.CARRIER_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getCarrierCodes());
        }

        if (DataIsolateValueTypeEnum.CUSTOMER_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getCustomerCodes());
        }

        if (DataIsolateValueTypeEnum.CONTRACT_BODY_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getContractBodyCodes());
        }

        if (DataIsolateValueTypeEnum.SOURCE_PLATFORM_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getSourcePlatformCodes());
        }

        if (DataIsolateValueTypeEnum.WAREHOUSE_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getWarehouseCodes());
        }

        if (DataIsolateValueTypeEnum.TRANSPORT_TYPE_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getTransportTypeCodes());
        }

        if (DataIsolateValueTypeEnum.SUB_TRANSPORT_TYPE_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getSubTransportTypeCodes());
        }

        if (DataIsolateValueTypeEnum.COMPANY_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getCompanyCodes());
        }

        if (DataIsolateValueTypeEnum.SIGN_BODY_CODES.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getContractBodyCodes());
        }

        if (DataIsolateValueTypeEnum.FROM_CITY_CODE.getCode().equals(dataIsolateValueName)) {
            return returnNoNullList(dataIsolateValue.getFromCityCodes());
        }

        return Collections.emptyList();
    }

    public static List<String> returnNoNullList(List<String> codes) {
        if (null==codes){
            return new ArrayList<>();
        }

        return new ArrayList<>(codes);
    }
}
